﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using Entidades;
using System.Collections;
using System.Data.SqlClient;

namespace CapaDatos.Adapters
{
    public class InscripcionAlumnoAdapter
    {

       BDRinconLuzEntities contexto;

        public InscripcionAlumnoAdapter()
        {
            contexto = RinconLuzContext.Context;
        }

        public InscripcionAlumnoAdapter(string edicion)
        {
            contexto = RinconLuzContext.ContextNew;
        }

        public void Agregar(InscripcionCicloLectivo entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            if (entidad.ChangeTracker != null && entidad.ChangeTracker.State == ObjectState.Added)
            {
                contexto.RegistrarCambios(entidad);
                contexto.RealizarCambios();
            }
        }

         public void Eliminar(InscripcionCicloLectivo entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            IObjectSet<InscripcionCicloLectivo> objectSet = contexto.CrearSet<InscripcionCicloLectivo>();

            objectSet.Attach(entidad);
            objectSet.DeleteObject(entidad);
        }



         public void Modificar(InscripcionCicloLectivo entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            if (entidad.ChangeTracker != null && (entidad.ChangeTracker.State & ObjectState.Deleted) != ObjectState.Deleted)
            {
                entidad.MarkAsModified();
            }

            contexto.RegistrarCambios(entidad);
            contexto.SaveChanges();
        }


        public IEnumerable<InscripcionCicloLectivo> Obtener()
        {
            return contexto.CrearSet<InscripcionCicloLectivo>();
        }

       


        public List<ViewEntity> ObtenerAlumnosCicloActual()
        {

            List<ViewEntity> Entidades = null;

            var Alumnos = (from v in contexto.Alumno
                              where  v.Eliminado != true
                                select v.LegajoAlumno).Except(from v in contexto.InscripcionCicloLectivo
                                                                    where v.Turno.CicloLectivo.FechaDesde.Value.Year == DateTime.Now.Year &&
                                                                    v.Eliminada != true
                                                                    select v.Alumno.LegajoAlumno);

            if (Alumnos.Count() > 0)
            {
                var Lista = (from v in contexto.Alumno
                             where Alumnos.Contains(v.LegajoAlumno)
                             select v).ToList();

                Entidades = new List<ViewEntity>();
                
                foreach (var item in Lista)
                {
                    TimeSpan edad = DateTime.Now.Subtract(item.FechaNacimiento);

                    if (edad.Days < 2190) // Menor a 6 años
                    {
                        Entidades.Add(new ViewEntity(item.LegajoAlumno, item.ApellidoAlumno + ", " + item.NombreAlumno + " / DNI: " + item.DniAlumno));

                    }

                }

                Entidades = Entidades.OrderBy(v => v.Descripcion).ToList();
            }
            
            return Entidades;

        }

        public List<ViewEntity> ObtenerTurnosCicloActual()
        {
            List<ViewEntity> Entidades = new List<ViewEntity>();

            var Turnos = (from v in contexto.Turno.Include("CicloLectivo")
                          where v.CicloLectivo.FechaDesde.Value.Year == DateTime.Now.Year &&
                          v.Eliminado != true
                          select v).ToList();

       
                foreach (var item in Turnos)
                {
                    var cantidadInscriptos = (from z in contexto.InscripcionCicloLectivo
                                              where z.Turno.IdTurno == item.IdTurno &&
                                              z.Eliminada != true
                                              select z).Count();

                    if (cantidadInscriptos < item.CupoMaximo)
                        Entidades.Add(new ViewEntity(item.IdTurno, item.CicloLectivo.NombreCicloLectivo + " - " + item.NombreTurno));

                }

                Entidades = Entidades.OrderBy(v => v.Descripcion).ToList();
          
            return Entidades;
        }

        public List<ViewEntity> ObtenerTurnosConInscriptos()
        {

            List<ViewEntity> Entidades = new List<ViewEntity>();

            var Turnos = (from v in contexto.Turno.Include("CicloLectivo")
                          where v.Eliminado != true
                          select v).ToList();


            foreach (var item in Turnos)
            {
                var cantidadInscriptos = (from z in contexto.InscripcionCicloLectivo
                                          where z.Turno.IdTurno == item.IdTurno &&
                                          z.Eliminada != true
                                          select z).Count();

                if (cantidadInscriptos  > 0)
                    Entidades.Add(new ViewEntity(item.IdTurno, item.CicloLectivo.NombreCicloLectivo + " - " + item.NombreTurno));

            }

            Entidades = Entidades.OrderBy(v => v.Descripcion).ToList();

            return Entidades;

        }

        public List<ViewEntity> ObtenerAlumnosInscriptosCiclo(int año)
        {

            List<ViewEntity> Entidades = new List<ViewEntity>();

            var Inscripciones = (from z in contexto.InscripcionCicloLectivo.Include("Alumno")
                                        where z.Turno.CicloLectivo.FechaDesde.Value.Year == año &&
                                        z.Eliminada != true
                                        select z).ToList();

            if (Inscripciones.Count > 0)
            {

                foreach(var item in Inscripciones)
                    Entidades.Add(new ViewEntity(item.LegajoAlumno, item.Alumno.ApellidoAlumno + ", " + item.Alumno.NombreAlumno + " / DNI: " + item.Alumno.DniAlumno));

            }
            

            Entidades = Entidades.OrderBy(v => v.Descripcion).ToList();
            return Entidades;
        }


        public InscripcionCicloLectivo ObtenerEntidad(Guid legajoAlumno, int año)
        {
            var entidad = (from v in contexto.InscripcionCicloLectivo.Include("Alumno")
                           where v.LegajoAlumno == legajoAlumno &&
                           v.Turno.CicloLectivo.FechaDesde.Value.Year == año &&
                           v.Eliminada != true
                           select v).First();

            return entidad;
        }

        public InscripcionCicloLectivo ObtenerEntidad(Guid idCiclo, Guid legajo_alumno)
        {
            var entidad = (from v in contexto.InscripcionCicloLectivo.Include("Turno.CicloLectivo")
                           where v.Turno.CicloLectivo.IdCicloLectivo == idCiclo &&
                            v.Alumno.LegajoAlumno == legajo_alumno &&
                           v.Eliminada != true
                           select v).First();

            return entidad;
        }

       

        public bool TieneEvaluación(Guid idEntidad)
        {

            var Resultado= (from v in contexto.EvaluacionAlumno
                                   where v.IdInscripcionCicloLectivo == idEntidad &&
                                   v.Eliminada != true
                                   select v).Any();

            return Resultado;

        }


        public bool ExistenInscriptos()
        {

            var Resultado = (from v in contexto.InscripcionCicloLectivo
                             where v.Turno.CicloLectivo.FechaDesde.Value.Year == DateTime.Now.Year &&
                             v.Eliminada != true
                             select v).Any();

            return Resultado;

        }

        public bool ExisteInscripcionAlumno(Guid idAlumno)
        {

            var Resultado = (from v in contexto.InscripcionCicloLectivo
                             where v.Alumno.LegajoAlumno == idAlumno &&
                             v.Eliminada != true
                             select v).Any();

            return Resultado;

        }

        public bool ExistenAlumnosSinEvaluar()
        {
            var Alumnos = (from v in contexto.InscripcionCicloLectivo
                                where v.Turno.CicloLectivo.FechaDesde.Value.Year == DateTime.Now.Year &&
                                v.Eliminada != true
                                select v.Alumno.LegajoAlumno).Except(from z in contexto.EvaluacionAlumno
                                                                        where z.InscripcionCicloLectivo.Turno.CicloLectivo.FechaDesde.Value.Year == DateTime.Now.Year &&
                                                                        z.Eliminada != true
                                                                        select z.InscripcionCicloLectivo.Alumno.LegajoAlumno);

            if (Alumnos.Count() > 0)
                return true;
            else
                return false;
            
        }

        public InscripcionCicloLectivo ObtenerEntidadMedianteAlumno(Guid legajoAlumno)
        {
            var entidad = (from v in contexto.InscripcionCicloLectivo.Include("Alumno").Include("Turno.CicloLectivo")
                           where v.LegajoAlumno == legajoAlumno &&
                           v.Turno.CicloLectivo.FechaDesde.Value.Year == DateTime.Now.Year &&
                           v.Eliminada != true
                           select v).First();

            return entidad;
        }

        public InscripcionCicloLectivo ObtenerEntidadAlumnoCiclo(Guid idCicloLectivo, Guid legajoAlumno)
        {
            var entidad = (from v in contexto.InscripcionCicloLectivo.Include("Turno.CicloLectivo")
                           where v.LegajoAlumno == legajoAlumno &&
                           v.Turno.CicloLectivo.IdCicloLectivo == idCicloLectivo &&
                           v.Eliminada != true
                           select v).First();

            return entidad;
        }

    }
}
